/*
 * Copyright 2020 eBlocker Open Source UG (haftungsbeschraenkt)
 *
 * Licensed under the EUPL, Version 1.2 or - as soon they will be
 * approved by the European Commission - subsequent versions of the EUPL
 * (the "License"); You may not use this work except in compliance with
 * the License. You may obtain a copy of the License at:
 *
 *   https://joinup.ec.europa.eu/page/eupl-text-11-12
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
package org.eblocker.lists.malware;

import org.eblocker.server.common.malware.MalwareEntry;
import org.eblocker.server.common.malware.MalwareUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class MalwarePatrolSanitizedUrlsParser {

    public List<MalwareEntry> parse(InputStream inputStream) throws IOException {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
            return parse(br.lines());
        }
    }

    public List<MalwareEntry> parse(Path filePath) throws IOException {
        return parse(Files.lines(filePath));
    }

    public List<MalwareEntry> parse(Stream<String> lines) {
        return lines.map(l -> l.split("\\t"))
            .filter(t -> t.length > 5)
            .map(t -> new MalwareTuple(MalwareUtils.normalize(t[2]), t[5]))
            .collect(Collectors.groupingBy(MalwareTuple::getUrl))
            .entrySet().stream()
            .map(e -> new MalwareEntry(e.getKey(), e.getValue().stream().map(MalwareTuple::getMalware).distinct().toArray(String[]::new)))
            .collect(Collectors.toList());
    }

    private static class MalwareTuple {
        private String url;
        private String malware;

        public MalwareTuple(String url, String malware) {
            this.url = url;
            this.malware = malware;
        }

        public String getUrl() {
            return url;
        }

        public String getMalware() {
            return malware;
        }
    }
}
